from django.shortcuts import render

from goods.models import SKU
from users.utlis import generic_active_url, get_active_user

# Create your views here.
from rest_framework.response import Response

from rest_framework.views import APIView

# from apps.users.models import User
from users.models import User
from users.serializers import RegisterCreateUserSerializer, SKUSerializer


class RegisterUsernameCountAPIView(APIView):
    def get(self, request, username):
        # 接受用户名

        # 教研参数是否重复
        count = User.objects.filter(username=username).count()
        # 返回响应
        return Response({'count': count})


class RegisterPhoneCountAPIView(APIView):
    def get(self, request, mobile):
        count = User.objects.filter(mobile=mobile).count()

        # 组织数据
        context = {
            'count': count,
            'phone': mobile
        }

        return Response(context)


class RegisterCreateUserView(APIView):
    def post(self,request):


        data=request.data

        serializers=RegisterCreateUserSerializer(data=data)
        serializers.is_valid(raise_exception=True)

        # 3.数据入库
        serializers.save()

        # 4.返回响应
        # user -  序列化器->  字典
        # serializer.data --- 将模型转换为字典的过程
        # 序列化器的 序列化(模型-->字典)操作原理是:
        # 我们的序列化器 根据 字段来获取 模型的属性的值,来转换为字典
        return Response(serializers.data)

# 用户注册之后跳转到首页

"""

一.断点
    在程序的入口出
    部分代码实现一个功能
    认为哪里有错误
    每行都加

二.事件的触发点
    很好的确定代码写在哪里


用户注册之后,直接跳转到首页,默认表示已经登录

#注册完成应该 返回给客户端一个token
#1.如何生成token
#2.在哪里返回

"""
from rest_framework.permissions import IsAuthenticated
from .serializers import UserCenterSerializer
# class UserCenterView(APIView):

    # """
    #     登录用户访问个人中心的时候 ,我们需要将个人信息返回获取
    #
    #     1. 如何确定是登录用户  --> 需要前端传递一个token过来
    #     2. 获取用户信息
    #     3. 返回数据
    #
    #     GET     /users/infos/
    #     """

    #权限
    #1.登录用户访问
    # permission_classes = [IsAuthenticated]
    #
    # def get(self,request):
    #     # 2.获取用户信息
    #     user = request.user
    #     # 3.返回数据
    #     serializer = UserCenterSerializer(user)
    #     return Response(serializer.data)


from rest_framework.mixins import RetrieveModelMixin

from rest_framework.generics import RetrieveAPIView

class UserCenterView(RetrieveAPIView):

    serializer_class = UserCenterSerializer

    queryset = User.objects.all()

    #权限
    permission_classes = [IsAuthenticated]

    def get_object(self):

        # 获取某一个指定的对象

        return self.request.user


"""
用户在点击设置的时候,输入 邮箱信息, 当点击保存的时候 需要将邮箱信息发送给后端


1. 这个接口必须是登录才可以访问
2. 接收参数
3. 验证数据
4. 更新数据
5. 发送激活邮件
6. 返回响应

PUT         /users/emails/


"""
# APIView
# GenericAPIView                    列表,详情通用支持,一般和mixin配合使用
# UpdateAPIView
from .serializers import UserEmailSerializer
from rest_framework.mixins import UpdateModelMixin
class UserEmailView(APIView):


    # 1. 这个接口必须是登录才可以访问
    permission_classes = [IsAuthenticated]

    def put(self,request):
        # 2. 接收参数
        data = request.data
        # 3. 验证数据
        user = request.user
        serializer = UserEmailSerializer(instance=user,data=data)
        serializer.is_valid(raise_exception=True)
        # 4. 更新数据
        serializer.save()

        # Celery 可以理解为 一个 消息中心
        #

        from celery_tasks.email.tasks import send_active_email

        send_active_email.delay(data.get('email'), request.user.id)

        # # 5. 发送激活邮件
        # from django.conf import settings
        #
        # from django.core.mail import send_mail
        # # subject, message, from_email, recipient_list,
        # #subject,  主题
        # subject = '美多商城激活邮件'
        # #  message,     内容
        # message = '内容'
        # # from_email,  发件人
        # from_email = settings.EMAIL_FROM
        # # recipient_list, 接收人列表
        # email = data.get('email')
        # recipient_list = [email]
        #
        # # 可以设置以下 html的样式等信息
        # verify_url = generic_active_url(user.id, email)
        #
        # html_message= '<p>尊敬的用户您好！</p>' \
        #            '<p>感谢您使用美多商城。</p>' \
        #            '<p>您的邮箱为：%s 。请点击此链接激活您的邮箱：</p>' \
        #            '<p><a href="%s">%s<a></p>' % (email, verify_url, verify_url)
        #
        #
        #
        # send_mail(subject=subject,
        #           message=message,
        #           from_email=from_email,
        #           recipient_list=recipient_list,
        #           html_message=html_message
        #
        #           )

        # 6. 返回响应
        return Response(serializer.data)


# from users.utlis import generic_active_url
from rest_framework import status
class UserActiveEmailView(APIView):
    """

       当用户点击激活连接的时候,会跳转到一个页面,这个页面中含有 token(含有 用户id和email信息)信息
       前端需要发送一个ajax请求,将 token 发送给后端

       1. 接受token
       2. 对token进行解析
       3. 返回响应

       GET     /users/emails/verification/?token=xxx
       """

    # 1. 接受token
    def get(self,request):
        token=request.query_params.get('token')
        if token is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # {id:xxx,email:xxx}
        # 2. 对token进行解析

        # id = xxx

        user = get_active_user(token)

        if user is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        user.email_active=True
        user.save()

        # 3. 返回响应
        return Response({'msg':'ok'})


"""

新增地址功能

前端将用户提交的数据 传递给后端

1.后端接受数据
2.对数据进行校验
3.数据入库
4.返回响应

POST    users/addresses/

"""
from rest_framework.generics import CreateAPIView
from .serializers import AddressSerializer

from rest_framework.viewsets import GenericViewSet  #笔记用的这个

from rest_framework.generics import GenericAPIView

class AddressCreateAPIView(CreateAPIView):

    serializer_class = AddressSerializer







# 历史记录
"""
String      key:value
Hash        hash_key:   key:value
List        list_key:   value,value,value
Set         set_key:    value4,value2,value10
Zset        zset_key:   value1,value2,value3


history_1: 1,3,5,

# 登录用户才可以请求

一.添加最近浏览
    在详情页面中, 我们去发送一个请求,这个请求中 包含 sku_id,用户信息(JWT)

    # 1. 我们要接收数据, 并且对数据进行校验
    # 2. 把数据保存起来
    # 3. 返回响应

    POST        /users/histories/


二.获取最近浏览
    1. 我们区接收数据 (用户信息,以JWT的形式传递)
    2. 查询数据
    3. 返回响应

"""
# APIView
# GenericAPIView                    列表,详情通用支持,一般和mixin配合使用
# CreateAPIView



from .serializers import UserHistorySerializer
from django_redis import get_redis_connection
# class UserHistoryView(APIView):
#
#     permission_classes = [IsAuthenticated]
#
#
#     def post(self,request):
#         user =  request.user
#         # 1. 我们要接收数据, 并且对数据进行校验
#         serializer = UserHistorySerializer(data=request.data)
#         serializer.is_valid(raise_exception=True)
#         # 2. 把数据保存起来  --redis
#
#         redis_con = get_redis_connection('history')
#
#         #2.1 获取商品id
#         sku_id = serializer.validated_data.get('sku_id')
#
#
#
#         # 2.2 先删除 这个 sku_id  为什么删除呢? 去重
#         redis_con.lrem('history_%s' % user.id, 0, sku_id)
#
#         # 2.21 保存到redis中
#         redis_con.lpush('history_%s'%user.id,sku_id)
#
#         #2.3
#         # 2.4对列表进行修剪
#         redis_con.ltrim('history_%s' % user.id, 0, 4)
#
#         # 3. 返回响应
#         return Response(serializer.data)
#
#
#     def get(self,request):
#         # 1. 我们区接收数据 (用户信息,以JWT的形式传递)
#         user = request.user
#
#         # 2. 查询数据
#         redis_conn = get_redis_connection('history')
#
#         sku_ids = redis_conn.lrange('history_%s' % user.id, 0, 5)
#         # [1,2,3,4,]
#         # skus = SKU.objects.filter(id__in=sku_ids)
#         # in查询的时候 不会保留原来的顺序
#
#         skus=[]
#         for sku_id in sku_ids:
#             sku = SKU.objects.get(id=sku_id)
#             skus.append(sku)
#
#         # [SKU,SKU,SKU]
#
#         serializer = SKUSerializer(skus, many=True)
#
#         # 3. 返回响应
#         return Response(serializer.data)



from rest_framework.mixins import CreateModelMixin

class UserHistoryView(CreateModelMixin,GenericAPIView):

    serializer_class = UserHistorySerializer

    def post(self,request):

        return self.create(request)

    def get(self, request):
        """获取"""
        # 获取用户信息
        user_id = request.user.id
        # 连接redis
        redis_conn = get_redis_connection('history')
        # 获取数据
        history_sku_ids = redis_conn.lrange('history_%s' % user_id, 0, 5)
        skus = []
        for sku_id in history_sku_ids:
            sku = SKU.objects.get(pk=sku_id)
            skus.append(sku)
        # 序列化
        serializer = SKUSerializer(skus, many=True)
        return Response(serializer.data)



















